/**
 * 控制台日志迁移脚本
 * 自动将项目中的console语句替换为智能日志工具
 */

const fs = require('fs')
const path = require('path')
const glob = require('glob')

// 需要处理的文件类型
const FILE_PATTERNS = [
  'src/**/*.vue',
  'src/**/*.js',
  'src/**/*.ts'
]

// 需要替换的console方法映射
const CONSOLE_MAPPINGS = {
  'console.log': 'logger.log',
  'console.info': 'logger.info',
  'console.debug': 'logger.debug',
  'console.warn': 'logger.warn',
  'console.error': 'logger.error'
}

// 需要添加导入语句的文件
const filesToAddImport = new Set()

/**
 * 处理单个文件
 */
function processFile(filePath) {
  console.log(`处理文件: ${filePath}`)
  
  let content = fs.readFileSync(filePath, 'utf8')
  let modified = false
  
  // 检查是否已经导入了logger
  const hasLoggerImport = content.includes("import logger from") || 
                         content.includes("import logger from '@/utils/logger'") ||
                         content.includes("import logger from './utils/logger'")
  
  // 替换console语句
  for (const [consoleMethod, loggerMethod] of Object.entries(CONSOLE_MAPPINGS)) {
    const regex = new RegExp(consoleMethod.replace('.', '\\.'), 'g')
    if (content.includes(consoleMethod)) {
      content = content.replace(regex, loggerMethod)
      modified = true
      console.log(`  - 替换 ${consoleMethod} 为 ${loggerMethod}`)
    }
  }
  
  // 如果需要添加导入语句
  if (modified && !hasLoggerImport) {
    filesToAddImport.add(filePath)
  }
  
  // 写回文件
  if (modified) {
    fs.writeFileSync(filePath, content, 'utf8')
    console.log(`  ✅ 文件已更新`)
  } else {
    console.log(`  ⏭️ 无需修改`)
  }
}

/**
 * 添加导入语句
 */
function addImportStatements() {
  console.log('\n添加导入语句...')
  
  for (const filePath of filesToAddImport) {
    console.log(`添加导入到: ${filePath}`)
    
    let content = fs.readFileSync(filePath, 'utf8')
    
    // 确定导入语句
    let importStatement
    if (filePath.includes('src/components/') || filePath.includes('src/views/')) {
      importStatement = "import logger from '@/utils/logger.js'\n"
    } else {
      importStatement = "import logger from './logger.js'\n"
    }
    
    // 在文件开头添加导入语句
    const lines = content.split('\n')
    let insertIndex = 0
    
    // 找到合适的位置插入导入语句
    for (let i = 0; i < lines.length; i++) {
      if (lines[i].startsWith('import ') || lines[i].startsWith('const ') || lines[i].startsWith('let ')) {
        insertIndex = i + 1
      } else if (lines[i].trim() === '' && insertIndex > 0) {
        break
      }
    }
    
    lines.splice(insertIndex, 0, importStatement)
    content = lines.join('\n')
    
    fs.writeFileSync(filePath, content, 'utf8')
    console.log(`  ✅ 导入语句已添加`)
  }
}

/**
 * 生成迁移报告
 */
function generateReport() {
  const report = {
    timestamp: new Date().toISOString(),
    processedFiles: filesToAddImport.size,
    consoleMappings: CONSOLE_MAPPINGS,
    summary: {
      totalFiles: filesToAddImport.size,
      filesWithImport: filesToAddImport.size
    }
  }
  
  const reportPath = path.join(__dirname, '..', 'migration-report.json')
  fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf8')
  console.log(`\n📊 迁移报告已生成: ${reportPath}`)
}

/**
 * 主函数
 */
function main() {
  console.log('🚀 开始迁移控制台日志...\n')
  
  // 获取所有需要处理的文件
  const allFiles = []
  FILE_PATTERNS.forEach(pattern => {
    const files = glob.sync(pattern, { cwd: path.join(__dirname, '..') })
    allFiles.push(...files.map(file => path.join(__dirname, '..', file)))
  })
  
  console.log(`找到 ${allFiles.length} 个文件需要处理\n`)
  
  // 处理每个文件
  allFiles.forEach(processFile)
  
  // 添加导入语句
  addImportStatements()
  
  // 生成报告
  generateReport()
  
  console.log('\n✅ 迁移完成!')
  console.log('\n📝 下一步:')
  console.log('1. 检查修改的文件是否正确')
  console.log('2. 运行 npm run serve 测试开发环境')
  console.log('3. 运行 npm run build 测试生产环境')
  console.log('4. 查看 migration-report.json 了解迁移详情')
}

// 运行脚本
if (require.main === module) {
  main()
}

module.exports = { processFile, addImportStatements, generateReport }
